﻿using System;
using System.IO;
using System.ServiceProcess;
using System.Threading;

namespace TypedROBIN.Imaging
{
    class IECaptService : System.ServiceProcess.ServiceBase
    {
        // The main entry point for the process
        public static void Main(string[] args)
        {
            // leading console parameter
            bool enableConsoleMode = false;
            if (args.Length > 0)
            {
                string arg = args[0];
                if (arg.Substring(1).ToLower() == "c")
                {
                    enableConsoleMode = true;
                }
            }

            if (enableConsoleMode)
            {
                #region Console Mode
                var service = new IECaptService();
                //service.GenerateSchema();
                service.OnStart(null);
                //Thread.Sleep(Timeout.Infinite);
                Console.ReadLine();
                #endregion
            }
            else
            {
                System.ServiceProcess.ServiceBase[] ServicesToRun;
                ServicesToRun =
                  new System.ServiceProcess.ServiceBase[] { new IECaptService() };
                System.ServiceProcess.ServiceBase.Run(ServicesToRun);
            }
        }
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            // 
            // WindowsService
            // 
            this.CanStop = true;
            this.CanHandlePowerEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.ServiceName = "IECaptService";

        }
        
        /// <summary>
        /// Set things in motion so your service can do its work.
        /// </summary>
        protected override void OnStart(string[] args)
        {
            RemotingRegister.CreateRemotingServerByCode();
        }

        //在衍生類別中實作時，當服務控制管理員 (SCM) 傳送停止命令至服務時執行。 指定在服務停止執行時所要執行的動作。 
        //使用 OnStop 來指定當服務接收停止命令時的處理。
        //當 SCM 接收停止命令時，使用 CanStop 的值驗證服務是否接受停止命令。 
        //如果 CanStop 為 true，傳遞停止命令至服務，並且呼叫 OnStop 方法 (如果已經定義)。 如果未在服務中實作 OnStop，SCM 會處理停止命令。 
        //如果 CanStop 為 false，SCM 則忽略停止命令。 它不會傳遞至服務。 傳回停止命令並且擲回例外狀況。 
        protected override void OnStop()
        {
            IECaptr.ServiceStopping = true;
            int SleepTime = 0;
            while (IECaptr.CurrentCallers.Count > 0 && SleepTime <180)
            {
                Thread.Sleep(1000);
                SleepTime++;
            }
        }

        //在衍生類別中實作時，當電腦的電源狀態已經變更時執行。 這適用於攜帶型電腦，當它們進入暫停模式的時候，不同於系統關閉。 
        // PowerBroadcastStatus http://msdn.microsoft.com/zh-tw/library/system.serviceprocess.powerbroadcaststatus.aspx
        protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
        {
            return true;
        }

        protected override void OnPause()
        {
        }

        protected override void OnContinue()
        {
        }

        //在衍生類別中實作時，當系統正在關閉時執行。 指定緊接在系統關閉之前應該發生的處理。 
        //使用 OnShutdown 以指定當系統關閉時應該發生的處理。這個事件只會在關閉作業系統而不在關閉電腦時發生。
        protected override void OnShutdown()
        {
            OnStop();
        }
    }
}
